﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace DreamShield.Deployment.Miles.CustomPage.StandardPages
{
    /// <summary>
    /// Page personnalisée affichant une boîte après la boite de sélection
    /// du mode de l'installation demandant à l'utilisateur un nom et un mot de passe.
    /// 
    /// Les valeurs seront stoquées dans les variables globales user_name et user_password
    /// et seront accessibles comme ceci, à partir d'un plugin Miles :
    /// GlobalInstallerVariables["user_name"] et GlobalInstallerVariables["user_password"]
    /// </summary>
    public partial class PageCollectUserInformations : UserControl
    {
        /// <summary>
        /// Plugin interne généré pour l'interraction avec l'installeur
        /// </summary>
        public virtual CustomPagePlugin Plugin { get; protected set; }

        /// <summary>
        /// Variables globales de l'installation
        /// </summary>
        public virtual Dictionary<string, object> GlobalInstallerVariables
        {
            get { return Plugin.GlobalInstallerVariables; }
        }

        /// <summary>
        /// Id de la page générée
        /// </summary>
        public virtual string GeneratedPageId
        {
            get { return "PageCollectUserInformations"; }
        }

        /// <summary>
        /// Crée une nouvelle page chargée de collecter le nom et le mot de passe d'un utilisateur
        /// pendant l'installation
        /// </summary>
        /// <param name="server">Serveur de plugin Miles actuel</param>
        public PageCollectUserInformations(MilesRootServer server)
        {
            if (server == null)
                throw new ArgumentNullException("server");

            InitializeComponent();

            /* création du plugin de page personnalisé */
            Plugin = new CustomPagePlugin(server,
                WizardPagesID.InstallationModePage,
                true,
                GeneratedPageId,
                this);

            Plugin.OnPageBegin += new EventHandler(Plugin_OnPageBegin);

            /* différentes options de la page */
            Plugin.ShowForCustom = false;
            Plugin.ShowForInstall = true;
            Plugin.ShowForUninstall = false;
            Plugin.ShowForUpdate = false;
            Plugin.CanShow = true;
            Plugin.CanGoNext = true;
            Plugin.CanGoBack = true;
            Plugin.CanCancel = true;
        }

        /// <summary>
        /// Intercepte l'affichage de la page afin de charger les valeurs des champs de textes
        /// à partir des variables d'installation globales
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void Plugin_OnPageBegin(object sender, EventArgs e)
        {
            LoadValuesFromVariables();
        }

        /// <summary>
        /// Texte affiché au dessus de la boite de texte devant recevoir le nom de l'utilisateur
        /// </summary>
        public virtual string UserName_Label
        {
            get { return lb_userName.Text; }
            set { lb_userName.Text = value; }
        }

        /// <summary>
        /// Texte affiché au dessus de la boite de texte devant recevoir le mot de passe de l'utilisateur
        /// </summary>
        public virtual string UserPass_Label
        {
            get { return lb_userPass.Text; }
            set { lb_userPass.Text = value; }
        }

        /// <summary>
        /// Nom de l'utilisateur (modifier cette propriété modifie également la valeur de la variable d'installation globale user_name)
        /// </summary>
        public virtual string UserName
        {
            get { return tx_userName.Text; }
            set { tx_userName.Text = value; GlobalInstallerVariables["user_name"] = value; }
        }

        /// <summary>
        /// Mot de passe de l'utilisateur (modifier cette propriété modifie également la valeur de la variable d'installation globale user_password)
        /// </summary>
        public virtual string UserPass
        {
            get { return tx_userPass.Text; }
            set { tx_userPass.Text = value; GlobalInstallerVariables["user_password"] = value; }
        }

        /// <summary>
        /// Charge les champs de textes à partir de la valeur des variables d'installation globales
        /// user_name et user_password
        /// </summary>
        public virtual void LoadValuesFromVariables()
        {
            tx_userName.Text = LoadStringVariable("user_name");
            tx_userPass.Text = LoadStringVariable("user_password");
        }

        /// <summary>
        /// Charge une variable d'installation globale
        /// </summary>
        /// <param name="variable">Nom de la variable</param>
        /// <returns>Valeur de la variable globale si elle existe et qu'il s'agit bien d'une chaine de caractères, la chaine vide (String.Empty) sinon</returns>
        protected virtual string LoadStringVariable(string variable)
        {
            object val = null;
            string result = "";
            if (GlobalInstallerVariables.TryGetValue(variable, out val))
                result = val as string;

            if (result == null)
                result = "";

            return result;
        }
        
        /// <summary>
        /// Appellé lorsque la valeur du champ de texte user_name change, affin de mettre à jour la variable d'installation globale
        /// correspondante
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void tx_userName_TextChanged(object sender, EventArgs e)
        {
            GlobalInstallerVariables["user_name"] = tx_userName.Text;
        }

        /// <summary>
        /// Appellé lorsque la valeur du champ de texte user_name change, affin de mettre à jour la variable d'installation globale
        /// correspondante
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void tx_userPass_TextChanged(object sender, EventArgs e)
        {
            GlobalInstallerVariables["user_password"] = tx_userPass.Text;
        }
    }
}
